Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / feature / docs / src / commonTest / kotlin / org / meshtastic / feature / docs / translation / DocTranslationCacheTest.kt

Displaying Raw • Download

feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCacheTest.kt bc5cf83df7fd6b405ffc521d7c3ed4e1f3e8271a (bc5cf83d) Text, 3.92 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.docs.translation

Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787okio.FileSystem
Tff7b72import T7ee787kotlin.test.AfterTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertNull
Tff7b72import T7ee787kotlin.test.assertTrue

Tff7b72class T56d364DocTranslationCacheTest Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3cacheDir Tff7b72= Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEM_TEMPORARY_DIRECTORY Tff7b72/ Ta5d6ff"Ta5d6ffdocs_cache_test_Tffd700${Te6edf3kotlinTb4b4b4.Te6edf3randomTb4b4b4.Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"
Tff7b72private Tff7b72val Te6edf3cache Tff7b72=
Te6edf3DocTranslationCacheTb4b4b4(
Te6edf3cacheDir Tff7b72= Te6edf3cacheDirTb4b4b4,
Te6edf3fileSystem Tff7b72= Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4,
Te6edf3maxCacheSizeBytes Tff7b72= T79c0ff1T79c0ff0T79c0ff2T79c0ff4Tb4b4b4, T8b949e// 1KB for testing eviction
Tb4b4b4)

Tf0883e@AfterTest
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4.Te6edf3deleteRecursivelyTb4b4b4(Te6edf3cacheDirTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
T8b949e// best effort cleanup
Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`get returns null for uncached page`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffabc123Ta5d6ff"Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`put then get returns cached content`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff# BienvenidoTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash1Ta5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff# BienvenidoTa5d6ff"Tb4b4b4, Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`different hash returns null - stale cache`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff# BienvenidoTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash2Ta5d6ff"Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`different locale returns null`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff# BienvenidoTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhash1Ta5d6ff"Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3resultTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`clear removes all cached entries`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontent1Ta5d6ff"Tb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontent2Ta5d6ff"Tb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffpage1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh1Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffpage2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh2Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`sizeBytes reports total cache size`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(T79c0ff0LTb4b4b4, Te6edf3cacheTb4b4b4.Te6edf3sizeBytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHelloTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3cacheTb4b4b4.Te6edf3sizeBytesTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`eviction removes oldest entries when over limit`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Fill cache beyond 1KB limit with multiple entries
Tff7b72val Te6edf3largeContent Tff7b72= Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff3T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh1Ta5d6ff"Tb4b4b4, Te6edf3largeContentTb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh2Ta5d6ff"Tb4b4b4, Te6edf3largeContentTb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh3Ta5d6ff"Tb4b4b4, Te6edf3largeContentTb4b4b4)
Te6edf3cacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpage4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh4Ta5d6ff"Tb4b4b4, Te6edf3largeContentTb4b4b4) T8b949e// triggers eviction

T8b949e// page4 should still be accessible as the newest entry
Tff7b72val Te6edf3page4 Tff7b72= Te6edf3cacheTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"Ta5d6ffpage4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh4Ta5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3largeContentTb4b4b4, Te6edf3page4Tb4b4b4)

T8b949e// Total size should be at or below max
Te6edf3assertTrueTb4b4b4(Te6edf3cacheTb4b4b4.Te6edf3sizeBytesTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff1T79c0ff0T79c0ff2T79c0ff4Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`md5Hash produces consistent hash`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hash1 Tff7b72= Te6edf3md5HashTb4b4b4(Ta5d6ff"Ta5d6ffHello, world!Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3hash2 Tff7b72= Te6edf3md5HashTb4b4b4(Ta5d6ff"Ta5d6ffHello, world!Ta5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3hash1Tb4b4b4, Te6edf3hash2Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`md5Hash differs for different content`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hash1 Tff7b72= Te6edf3md5HashTb4b4b4(Ta5d6ff"Ta5d6ffHelloTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3hash2 Tff7b72= Te6edf3md5HashTb4b4b4(Ta5d6ff"Ta5d6ffWorldTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3hash1 Tff7b72!Tff7b72= Te6edf3hash2Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.09s